/*
 * Project Name spring-boot-tools
 * File Name Connection
 * Package Name com.huxiaosu.tools.cmpp.model.action
 * Create Time 2024/4/20
 * Create by name：liujie
 */
package com.huxiaosu.tools.cmpp.model.action;

import com.huxiaosu.tools.cmpp.model.MessageHeader;
import com.huxiaosu.tools.cmpp.utils.Length;
import com.huxiaosu.tools.cmpp.utils.Utils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import static com.huxiaosu.tools.cmpp.utils.Constants.CMPP_VERSION;

/**
 * SP请求连接到ISMG消息体定义CMPP_CONNECT操作的目的是SP向ISMG注册作为一个合法SP身份
 * 若注册成功后即建立了应用层的连接，此后SP可以通过此ISMG接收和发送短信。 ISMG 以 CMPP_CONNECT_RESP 消息响应 SP 的请求。
 * <li>SP -> ISMG</li>
 *
 * @author liujie
 * @date 2024/4/20 11:38
 */
@Data
@Slf4j
public class ConnectMsg extends MessageHeader {

    /**
     * 源地址，此处为SP_Id，即SP的企业代码。
     */
    private String sourceAddr;

    /**
     * 用于鉴别源地址。其值通过单向MD5 hash计算得出，表示如下：
     * <li>AuthenticatorSource = MD5（Source_Addr+9 字节的0 +shared secret+timestamp）</li>
     * <li>Shared secret 由中国移动与源地址实体事先商定，</li>
     * <li>timestamp格式为：MMDDHHMMSS，即月日时分秒，10位。</li>
     */
    private byte[] authenticatorSource;

    /**
     * 双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号)，对于3.0的版本，高4bit为3，低4位为0
     */
    private byte version;

    /**
     * 时间戳的明文,由客户端产生,格式为MMDDHHMMSS，即月日时分秒，10位数字的整型，右对齐 。
     */
    private int timestamp;
    @Override
    public byte[] toBytes() {
        ByteArrayOutputStream bous = new ByteArrayOutputStream();
        DataOutputStream dous = new DataOutputStream(bous);
        try {
            dous.writeInt(this.getTotalLength());
            dous.writeInt(this.getCommandId());
            dous.writeInt(this.getSequenceId());
            Utils.writeString(dous, this.sourceAddr, Length.Connect.SOURCE_ADDR);
            dous.write(authenticatorSource);
            dous.writeByte(CMPP_VERSION);
            dous.writeInt(timestamp);
            dous.close();
        } catch (IOException e) {
            throw new RuntimeException();
        }
        return bous.toByteArray();
    }
}
